#include "TPila.h"

int Pila_Crear(TPila* pila, int tam_dato) {
    pila->tope = NULL;
    pila->tam_elem = tam_dato;
    return PILA_OK;
}

int Pila_Vacia (TPila* pila) {
	return !(pila->tope);
}

int Pila_Agregar (TPila* pila, void* elemento) {
    TNodoPilaCola* nodo;
    nodo = (TNodoPilaCola*)malloc(sizeof(TNodoPilaCola));
    if (nodo){
        nodo->elemento = malloc(pila->tam_elem);
        if (nodo->elemento){
            memcpy (nodo->elemento,elemento,pila->tam_elem);
            if (Pila_Vacia(pila)) {
                pila->tope = nodo;
            }
            else {
                nodo->siguiente = pila->tope;
                pila->tope = nodo;
            }
            return PILA_OK;
        }
        free (nodo);
        return PILA_ERR_MEM_ELEM;
    }
    return PILA_ERR_MEMORIA;
}

int Pila_Sacar (TPila* pila, void* elemento){
    TNodoPilaCola* nodo;
    if (Pila_Vacia(pila))
        return PILA_VACIA;
    else {
        nodo = pila->tope;
        pila->tope = nodo->siguiente;
        memcpy(elemento,nodo->elemento,pila->tam_elem);
        free(nodo->elemento);
        free (nodo);
        return PILA_OK;
    }
}

int Pila_Vaciar (TPila* pila) {
    TNodoPilaCola *nodo;
    while (!Pila_Vacia (pila)) {
        nodo = pila->tope;
        pila->tope = nodo->siguiente;
        free (nodo->elemento);
        free (nodo);
    }
    pila->tope = NULL;
    return PILA_OK;
}

